package com.zbangmall.util.common;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * 压缩文档相关的工具类
 */
public final class ZIPUtil {
	/**
	 * 文档压缩
	 *
	 * @param file 需要压缩的文件或目录
	 * @param dest 压缩后的文件名称
	 * @throws Exception
	 */
	public final static void deCompress(File file, String dest) throws Exception {
		try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest))) {
			zipFile(file, zos, "");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public final static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {
		if (inFile.isDirectory()) {
			File[] files = inFile.listFiles();
			if (CheckUtil.valid(files)) {
				for (File file : files) {
					String name = inFile.getName();
					if (!"".equals(dir)) {
						name = dir + "/" + name;
					}
					zipFile(file, zos, name);
				}
			}
		} else {
			String entryName = null;
			if (!"".equals(dir)) {
				entryName = dir + "/" + inFile.getName();
			} else {
				entryName = inFile.getName();
			}
			ZipEntry entry = new ZipEntry(entryName);
			zos.putNextEntry(entry);
			try (InputStream is = new FileInputStream(inFile)) {
				int len = 0;
				while ((len = is.read()) != -1) {
					zos.write(len);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 文档解压
	 *
	 * @param source 需要解压缩的文档名称
	 * @param path   需要解压缩的路径
	 */
	public final static void unCompress(File source, String path) throws IOException {
		ZipEntry zipEntry = null;
		FileUtil.createPaths(path);
		//实例化ZipFile，每一个zip压缩文件都可以表示为一个ZipFile
		//实例化一个Zip压缩文件的ZipInputStream对象，可以利用该类的getNextEntry()方法依次拿到每一个ZipEntry对象
		try (
				ZipFile zipFile = new ZipFile(source);
				ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(source))
		) {
			while ((zipEntry = zipInputStream.getNextEntry()) != null) {
				String fileName = zipEntry.getName();
				File   temp     = new File(path + "/" + fileName);
				if (!temp.getParentFile().exists()) {
					temp.getParentFile().mkdirs();
				}
				try (OutputStream os = new FileOutputStream(temp);
					 //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
					 InputStream is = zipFile.getInputStream(zipEntry)) {
					int len = 0;
					while ((len = is.read()) != -1) {
						os.write(len);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
